﻿///Autor: Torley
///Erstellungsdatum: 2010-03-09
///Funktion: Ticketmanager der Tickets für Obst und Zucker verteilt. 
///Zustand: Hat einen Bug, so das die alten Zucker nicht gelöscht werden.
///Kommt nun ein neuer Zuckerhaufen der weiter weg ist als der alte wird null zurück gegeben
using System;
using System.Collections.Generic;
using System.Text;
using AntMe.Deutsch;
using System.Collections;

namespace AntMe.Spieler.OpenAnt
{
    public class Ticket
    {
        public Ticket(Spielobjekt ziel)
        {
            ticketZiel = ziel;
        }

        private Spielobjekt ticketZiel;
        public Spielobjekt TicketZiel
        {
            get { return ticketZiel; }
        }
    }

    public class Ticketmanager
    {
        private static Dictionary<Spielobjekt, int> dicZucker = new Dictionary<Spielobjekt, int>();
        private static Dictionary<Spielobjekt, int> dicObst = new Dictionary<Spielobjekt, int>();
        private const int iMaxAnzahlZuckerAmeisen = 10;
        private const int iAnzahlAmeisenProObst = 5;

        public static void MeldeObjekt(Spielobjekt objekt)
        {
            if (objekt != null)
            {
                if (objekt is Zucker)
                {
                    if (!dicZucker.ContainsKey(objekt))
                    {
                        dicZucker.Add(objekt, ((Zucker)objekt).Menge/iMaxAnzahlZuckerAmeisen);
                    }
                }
                else if (objekt is Obst)
                {
                    if (!dicObst.ContainsKey(objekt))
                    {
                        dicObst.Add(objekt, iAnzahlAmeisenProObst);
                    }
                }
            }
        }

        public static void MeldeMisserfolg(Ticket tic, Basisameise Meise)
        {
            if (tic != null)
            {
                if (tic.TicketZiel is Zucker)
                {
                    if (dicZucker.ContainsKey(tic.TicketZiel))
                    {
                        dicZucker[tic.TicketZiel]++;
                    }
                    else
                    {
                        dicZucker.Add(tic.TicketZiel, 1);
                    }
                }
                else if (tic.TicketZiel is Obst)
                {
                    if (dicObst.ContainsKey(tic.TicketZiel))
                    {
                        dicObst[tic.TicketZiel]++;
                    }
                    else
                    {
                        dicObst.Add(tic.TicketZiel, 1);
                    }
                }
            }
        }

        private static Spielobjekt GetIndexOfNearstObjekt(Dictionary<Spielobjekt, int> Liste, Basisameise Meise)
        {
            Spielobjekt[] Objects = new Spielobjekt[Liste.Keys.Count];
            Liste.Keys.CopyTo(Objects, 0);

            int iNearstIndex = -1;
            int iSmallestDistance = int.MaxValue;
            for (int i = 0; i < Liste.Count; i++)
			{
                //Prüfen ob noch Tickets dafür vorhanden sind
                if (Liste[Objects[i]] == 0)
                {
                    continue;
                }
                //entfernen wenn leer
                if (Objects[i] is Zucker)
                {
                    if (((Zucker)Objects[i]).Menge <= 0)
                    {
                        dicZucker.Remove(Objects[i]);
                        continue;
                    }
                }
                if (Objects[i] is Obst)
                {
                    if (((Obst)Objects[i]).Menge <= 0)
                    {
                        dicObst.Remove(Objects[i]);
                        continue;
                    }
                }
                //entfernung speichenr wenn kleiner als bisher kleinste
                if (Koordinate.BestimmeEntfernung(Objects[i], Meise) < iSmallestDistance)
                {
                    iSmallestDistance = Koordinate.BestimmeEntfernung(Objects[i], Meise);
                    iNearstIndex = i;
                }
            }
            if (iNearstIndex == -1)
            {
                return null;
            }
            return Objects[iNearstIndex];
        }

        public static Ticket GibTicketZucker(Basisameise Meise)
        {
            if (dicZucker.Count != 0)
            {
                Spielobjekt Obj = GetIndexOfNearstObjekt(dicZucker, Meise);
                if (Obj != null && dicZucker[Obj] > 0)
                {
                    dicZucker[Obj]--;
                    return new Ticket(Obj);
                }
            }
            return null;
        }

        public static Ticket GibTicketObst(Basisameise Meise)
        {
            if (dicObst.Count != 0)
            {
                Spielobjekt Obj = GetIndexOfNearstObjekt(dicObst, Meise);
                if (Obj != null && dicObst[Obj] > 0)
                {
                    dicObst[Obj]--;
                    return new Ticket(Obj);
                }
            }
            return null;
        }

        internal static void MeldeLeeresObjekt(Spielobjekt spielobjekt)
        {
            //throw new NotImplementedException();
        }
    }
}
